'use strict';

const Service = require('egg').Service;

class VerifyCodeService extends Service {


  /**
   * 获取验证码 创建验证码
   * @param {String} account 要验证的账号
   * @return {Object} Promise
   */
  async createVerifyCode(account) {
    const { app, ctx } = this;
    const msg = {};

    // 如果当前账号不能识别的话 提示用户
    if (!ctx.helper.validMobile(account) && !ctx.helper.validEmail(account)) {
      msg.msg = `未知的账号:${account} 如有疑问请联系管理员QQ:877880098`;
      return msg;
    }

    // 生成6位验证码
    const code = ctx.helper.rand(6);
    const payload = { account, code };

    // 如果是手机的话
    if (ctx.helper.validMobile(account)) {
      payload.type = 1;
      // const sendResult = await ctx.helper.sendMobile(account);
      // if (sendResult) {
      //   msg.msg = `发送短信验证码出现了错误${sendResult}`;
      //   return msg;
      // }
    }

    // 如果是邮箱登录的话
    if (ctx.helper.validEmail(account)) {
      payload.type = 2;

      const email = {
        title: '某某网---邮箱验证码',
        body: `
                <h1>尊敬的：${account}用户</h1>
                <p style="font-size: 18px;color:#000;">
                    您的验证码为：
                    <span style="font-size: 20px;color:#f00;"> ${code}， </span>
                    您当前正在某某网站注册账号，验证码告知他人将会导致数据信息被盗，请勿泄露
                </p>
                <p style="font-size: 1.5rem;color:#999;">该验证码5分钟内有效，请勿泄漏于他人！</p>
                `,
      };
      const emailCotent = {
        from: '877880098@qq.com', // 发件人地址
        to: `${account}`, // 收件人地址，多个收件人可以使用逗号分隔
        subject: email.title, // 邮件标题
        html: email.body, // 邮件内容
      };
      const sendResult = await ctx.helper.sendEmail(emailCotent);
      if (sendResult) {
        msg.msg = `发送邮件出现了错误${sendResult}`;
        return msg;
      }
    }

    // 判断当前数据库是否已经存过验证码
    const isCode = await this.showVerifyCode({ account });
    // 判断该账号是否存在数据库中
    if (isCode) {
      // 判断获取验证码的次数是否大于5次
      if (isCode.number >= 5) {
        // 判断获取验证码的次数是否大于5次 并30分钟后重新获取的 就把number改为1 把最新验证码也更新后反回验证码
        if ((Date.now() - +new Date(isCode.updatedAt)) > 1800000) {
          payload.number = 1;
          await app.model.VerifyCode.update(payload, { where: { account } });
          return await this.showVerifyCode({ account });
        }

        // 获取验证码次数大于5次就提示
        const d = new Date(1800000 - (Date.now() - +new Date(isCode.updatedAt)));
        const residue = d.getMinutes() + 1;
        msg.msg = `获取验证码太频繁了，请${residue}分钟后再获取验证码`;
        return msg;
      }

      // 如果数据库中存过验证码 则更新验证码 并反回
      await app.model.VerifyCode.increment('number', { where: { account } });
      await app.model.VerifyCode.update(payload, { where: { account } });
      return await this.showVerifyCode({ account });
    }
    // 如果数据库中没存过该账号的密码 则创建验证码 并反回
    console.log('获取验证码成功', payload);
    return await app.model.VerifyCode.create(payload);
  }

  /**
   * 获取单条验证码
   * @param {Object} param0 查询对象
   * @return {Object} Promise
   */
  async showVerifyCode({ ...args }) {
    const { app } = this;
    const where = { ...args };
    return await app.model.VerifyCode.findOne({ where });
  }

  /** 未启用
   * 删除验证码 批量或单独删除
   * @param {Array} payload ids
   * @return Promise
   */
  async destroyVerifyCode(payload) {
    const { app } = this;
    return await app.model.VerifyCode.destroy({ where: { id: payload.ids }, force: true });
  }

}

module.exports = VerifyCodeService;
